package strategyDesignPattern

/**
 * 策略模式:
 * 定义一组算法,将每个算法都封装起来,并且使它们之间可以互换,
 * 将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以互相替换,使得算法可以在不影响到客户端的情况下发生变化.
 *
 * 角色:
 * 环境(Context):也叫上下文,起到承上启下的作用,屏蔽高层模块对策略,算法的直接访问,它持有一个Strategy的引用.
 * 抽象策略(Strategy):该角色对策略,算法进行抽象,通常定义每个策略或算法必须具有的方法和属性.
 * 具体策略(ConcreteStrategy):该角色实现抽象策略中的具体操作,含有具体的算法.
 *
 * 优点:
 * 使用策略模式可以避免使用多重条件转移语句.
 * 缺点:
 * 客户端必须知道所有的策略类,并自行决定使用哪一个,意味着客户端必须理解这些算法的区别.
 * 策略模式造成很多的策略类.
 *
 * 示例:
 * 在做内容分享的时候,需要把内容分享到各个平台,但是每种平台的分享逻辑都不一样,所以可以使用策略模式对不同的分享平台的差异进行封装,
 * 封装后有两个好处:
 * 1.使各个分享平台的逻辑单独处理,降低耦合性
 * 2.把各平台的差异隐藏起来,调用者只需要关心所要分享的平台,而不需要关心实现细节
 *
 */
fun main() {
    val share = Share()
    share.shareOptions(ShareChannel.SINA)
    share.shareOptions(ShareChannel.WE_CHART)
}
